package com.example.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.example.domain.Customer;
/**
 * @Cacheable : 表明所修饰的方法是可以缓存的：当第一次调用这个方法时，它的结果会被缓存下来，在缓存的有效时间内，以后访问这个方法都直接返回缓存结果，不再执行方法中的代码段。<br>
 * @Cacheable :　与@Cacheable不同，@CachePut不仅会缓存方法的结果，还会执行方法的代码段。<br>
 * 
 * @author lli 
 *
 * @version 1.0
 *
 */
@Service
@CacheConfig(cacheNames = "test1")
public class CacheService {
    
    List<Customer> cache = new ArrayList<Customer>();
    
    /**
     * 
     * @description t不仅会缓存方法的结果，还会执行方法的代码段
     * @author lli
     * @create 2017年6月10日下午3:51:16
     * @version 1.0
     * @param parm
     */
    @CachePut(key = "#parm.id")
    public void updateUser(Customer parm) {
        cache.add(parm);
        System.out.println("添加操作");
    }

    /**
     * 
     * @description 将缓存保存进test1，并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key
     * @author lli
     * @create 2017年6月10日下午3:32:35
     * @version 1.0
     * @param id
     * @return
     */
    @Cacheable(key = "#id + 'findByID'")
    public Customer findByID(String id) {
        System.out.println("查找");
        for (Customer ss : cache) {
            if (StringUtils.equalsIgnoreCase(id, ss.getId())) {
                return ss;
            }
        }
        return null;
    }

    /**
     * 
     * @description 将缓存保存进test1，并当参数userId的长度小于32时才保存进缓存，默认使用参数值及类型作为缓存的key
     * @author lli
     * @create 2017年6月10日下午3:33:20
     * @version 1.0
     * @param userId
     * @return
     */
    @Cacheable(condition = "#id.length < 32")
    public boolean isReserved(String id) {
        System.out.println("hello andCache" + id);
        return false;
    }

    /**
     * 
     * @description 清除掉指定key的缓存
     * @author lli
     * @create 2017年6月10日下午3:35:55
     * @version 1.0
     * @param parm
     */
    @CacheEvict(key = "#parm.id + 'findByID'")
    public void deleteById(Customer parm) {

    }

    /**
     * 
     * @description 清除掉全部缓存
     * @author lli
     * @create 2017年6月10日下午3:36:36
     * @version 1.0
     */
    @CacheEvict(allEntries = true)
    public void deleteAll() {
        System.out.println("deleteAll");
    }
}
